// 商品分类状态管理store
import { store } from "@/store";
import CategoryAPI, {
  type CategoryListParams,
  type CategoryItem,
  type CategoryFormData,
  type SubjectCategoryParams,
} from "@/api/goods/category";

/**
 * 创建分类管理store
 * 包含分类列表和获取分类的方法
 */
export const useCategoryStore = defineStore("category", () => {
  // 存储分类列表的响应式引用
  const list = ref<CategoryItem[]>([]);
  // 定义一个响应式对象，用于跟踪不同操作的加载状态
  const loading = reactive({
    list: false, // 分类列表加载状态
    subjectList: false, // 主题分类列表加载状态
    create: false, // 创建分类加载状态
    update: false, // 更新分类加载状态
    delete: false, // 删除分类加载状态
  });

  const totalCount = ref(0); // 总记录数

  const totalPage = ref(0); // 总页数

  /**
   * 获取商品分类列表
   * @param query 分类查询参数对象
   * @returns Promise 包含API响应结果
   */
  async function fetchCategoryList(query: CategoryListParams) {
    try {
      // 开始加载分类列表，设置加载状态为true
      loading.list = true;
      // 调用GoodsAPI的getCategories方法获取分类列表
      const response = await CategoryAPI.getCategoryList(query);
      // 分类列表加载完成，设置加载状态为false
      loading.list = false;
      // 如果响应存在，更新分类列表
      if (response) {
        list.value = response.records;
        totalCount.value = response.total_count;
        totalPage.value = response.total_page;
        return response;
      }
    } catch (error) {
      // 加载出错，设置加载状态为false
      loading.list = false;
      // 抛出错误
      throw error;
    }
  }

  /**
   * 获取商品分类列表
   * @param query 分类查询参数对象
   * @returns Promise 包含API响应结果
   * @example
   * const { list, loading, totalCount, totalPage, fetchCategoryList } = useCategoryStore();
   * await fetchCategoryList({ page: 1, page_size: 10 });
   */
  async function fetchSubjectCategoryList(query: SubjectCategoryParams) {
    try {
      // 开始加载分类列表，设置加载状态为true
      loading.subjectList = true;
      // 调用GoodsAPI的getCategories方法获取分类列表
      const response = await CategoryAPI.getSubjectCategoryList(query);
      // 分类列表加载完成，设置加载状态为false
      loading.subjectList = false;
      return response;
    } catch (err: any) {
      console.log(err);
      loading.subjectList = false;
    }
  }

  /**
   * 创建新的商品分类
   * @param data 分类表单数据对象
   * @returns Promise 包含API响应结果
   */
  async function fetchCreateCategory(data: Partial<CategoryFormData>) {
    try {
      // 开始创建分类，设置加载状态为true
      loading.create = true;
      // 调用GoodsAPI的createCategory方法创建分类
      const response = await CategoryAPI.addCategory(data);
      // 分类创建完成，设置加载状态为false
      loading.create = false;
      // 如果响应存在，返回响应结果
      if (response) {
        return response;
      }
    } catch (error) {
      // 创建出错，设置加载状态为false
      loading.create = false;
      // 抛出错误
      throw error;
    }
  }

  /**
   * 删除指定ID的商品分类
   * @param id 要删除的分类的ID
   * @returns Promise 包含API响应结果
   */
  async function fetchDeleteCategory(id: number) {
    try {
      // 开始删除分类，设置加载状态为true
      loading.delete = true;
      // 调用GoodsAPI的deleteCategory方法删除分类
      const response = await CategoryAPI.deleteCategory(id);
      // 分类删除完成，设置加载状态为false
      loading.delete = false;
      // 如果响应存在，返回响应结果
      if (response) {
        return response;
      }
    } catch (error) {
      // 删除出错，设置加载状态为false
      loading.delete = false;
      // 抛出错误
      throw error;
    }
  }

  /**
   * 更新商品分类信息
   * @param data 包含分类ID和更新数据的表单数据对象
   * @returns Promise 包含API响应结果
   */
  async function fetchUpdateCategory(data: Partial<CategoryFormData>) {
    try {
      // 开始更新分类，设置加载状态为true
      loading.update = true;
      // 调用GoodsAPI的updateCategory方法更新分类
      const response = await CategoryAPI.updateCategory(data);
      // 分类更新完成，设置加载状态为false
      loading.update = false;
      // 如果响应存在，返回响应结果
      if (response) {
        return response;
      }
    } catch (error) {
      // 更新出错，设置加载状态为false
      loading.update = false;
      // 抛出错误
      throw error;
    }
  }

  return {
    list,
    loading,
    totalCount,
    totalPage,
    fetchCategoryList,
    fetchCreateCategory,
    fetchDeleteCategory,
    fetchUpdateCategory,
    fetchSubjectCategoryList,
  };
});

/**
 * 提供在组件中使用的分类store hook
 * @returns 分类管理store实例
 */
export default function useCategoryStoreHook() {
  return useCategoryStore(store);
}
